package org.csu.gp_store.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.csu.gp_store.bo.CartItemBO;
import org.csu.gp_store.entity.CartItem;
import org.csu.gp_store.entity.Item;
import org.csu.gp_store.entity.Product;
import org.csu.gp_store.mapper.CartItemMapper;
import org.csu.gp_store.mapper.ItemMapper;
import org.csu.gp_store.mapper.ProductMapper;
import org.csu.gp_store.service.CartItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class CartItemServiceImpl implements CartItemService {

    @Autowired
    private CartItemMapper cartItemMapper;
    @Autowired
    private ItemMapper itemMapper;
    @Autowired
    private ProductMapper productMapper;

    @Override
    public List<CartItemBO> getCartItemBOListByAccountID(Long accountID) {
        QueryWrapper<CartItem> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("accountID", accountID);
        List<CartItem>cartItemList= cartItemMapper.selectList(queryWrapper);
        List<CartItemBO>cartItemBOList=new ArrayList<>();
        Product product;
        Item item;
        for (CartItem cartItem: cartItemList){
            item =itemMapper.selectById(cartItem.getItemID());
            product =productMapper.selectById(item.getProductID());
            cartItemBOList.add(CartItemBO.toCartItemBO(product,item,cartItem));
        }
        return cartItemBOList;
    }

    @Override
    public CartItem getCartItemByCartID(Long cartID) {
        QueryWrapper<CartItem> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("cartID", cartID);
        return cartItemMapper.selectOne(queryWrapper);
    }

    @Override
    public CartItem getCartItemByAccountIDAndItemID(Long accountID, Long itemID) {
        QueryWrapper<CartItem> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("accountID", accountID).eq("itemID",itemID);
        return cartItemMapper.selectOne(queryWrapper);
    }

    @Override
    public int updateCartItemQuantity(Long cartID, int quantity) {
        UpdateWrapper<CartItem> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("cartID", cartID).set("quantity", quantity);
        return cartItemMapper.update(null, updateWrapper);
    }

    @Override
    public int updateCartItemQuantityAddOne(Long cartID) {
        CartItem cartItem = getCartItemByCartID(cartID);
        UpdateWrapper<CartItem> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("cartID", cartID).set("quantity", cartItem.getQuantity() + 1);
        return cartItemMapper.update(null, updateWrapper);
    }

    @Override
    public int deleteItemFromCart(Long cartID) {
        return cartItemMapper.deleteById(cartID);
    }

    @Override
    public int addItemToCartItem(CartItem cartItem) {
        if (getCartItemByAccountIDAndItemID(cartItem.getAccountID(), cartItem.getItemID())==null) {
            return cartItemMapper.insert(cartItem);
        } else {
            return updateCartItemQuantityAddOne(getCartItemByAccountIDAndItemID(cartItem.getAccountID(), cartItem.getItemID()).getCartID());
        }
    }
}
